float abs(float x)
	if x>0 then
		return x;
	else
		return -x;
	end
end
Line PerpBisect(Point A, Point B)
	Line l1=library.LineST(A,B,2);
	Circle c1=library.DrawCircle(A,l1);
	Circle c2=library.DrawCircle(B,l1);
	Point C=library.intersect(c1,c2,true);
	Point D=library.intersect(c1,c2,false);
	Line l3=library.LineST(C,D,2);
	l1.setvisible(false);
	c1.setvisible(false);
	c2.setvisible(false);
	C.setvisible(false);
	D.setvisible(false);
	return l3;
end

Point MidPoint(Point A, Point B)
	Line l1=PerpBisect(A,B);
	Line l2=library.LineST(A,B,2);
	Point midpoint=library.intersect(l1,l2,true);
	return midpoint;
end
Line parallel(Point A, Line l)
	Line l2;
	if l.getLineType()==2 then
		l2=l;
	else
		l2=library.LineST(l.getStart(),l.getEnd(),2);
		l2.setvisible(false);
	end	
	Point B=l2.getStart();
	Point C=l2.getEnd();
	Line l3=library.LineST(A,C,2);
	l3.setvisible(false);
	Circle c1=library.DrawCircle(A,l2);
	c1.setvisible(false);
	Circle c2=library.DrawCircle(B,l3);
	c2.setvisible(false);
	Point D=library.intersect(c1,c2,true);
	D.setvisible(false);
	Point E=library.intersect(c1,c2,false);
	E.setvisible(false);
	Line l4;
	if (D.getX()-A.getX())*(C.getY()-B.getY())-(C.getX()-B.getX())*(D.getY()-A.getY())<0.1 && (D.getX()-A.getX())*(D.getY()-A.getY())>0.1 then

		l4=library.LineST(A,D,2);
	else
		l4=library.LineST(A,E,2);
	end
	return l4;	
end
Point onethird(Point A, Point B,integer prop)
	Line l1=library.LineST(A,B,2);
	l1.setvisible(false);
	Circle c1=library.DrawCircle(A,l1);
	c1.setvisible(false);
	Circle c2=library.DrawCircle(B,l1);
	c2.setvisible(false);
	Point C=library.intersect(c1,c2,true);
	C.setvisible(false);
	Point GG=library.intersect(c1,c2,false);
	GG.setvisible(false);
	Line l2=library.LineST(A,C,2);
	l2.setvisible(false);
	Circle c3=library.DrawCircle(C,l2);
	c3.setvisible(false);
	Point D=library.intersect(c3,l2,true);
	D.setvisible(false);
	Point E=library.intersect(c3,l2,false);
	E.setvisible(false);
	Point F;
	if abs(D.getX()-A.getX())+abs(D.getY()-A.getY())<abs(E.getX()-A.getX())+abs(E.getY()-A.getY()) then
		F=E;
	else
		F=D;
	end
	Line l3=library.LineST(C,F,2);
	l3.setvisible(false);
	Circle c4=library.DrawCircle(F,l2);
	c4.setvisible(false);
	Point G=library.intersect(c4,l2,true);
	G.setvisible(false);
	Point H=library.intersect(c4,l2,false);
	H.setvisible(false);
	Point I;
	if abs(G.getX()-C.getX())+abs(G.getY()-C.getY())<abs(H.getX()-C.getX())+abs(H.getY()-C.getY()) then
		I=H;
	else
		I=G;
	end
	Line l4=library.LineST(B,I,2);
	l4.setvisible(false);
	Line l5;
	Point J;
	if prop==1 then
		l5=parallel(C,l4);
		J=library.intersect(l1,l5,true);
	else
		l5=parallel(F,l4);
		J=library.intersect(l1,l5,true);
	end
	l5.setvisible(false);
	return J;
end
float Dist(Point X1,Point X2)
	return (X1.getX()-X2.getX())*(X1.getX()-X2.getX())+(X1.getY()-X2.getY())*(X1.getY()-X2.getY());
end
integer snowflake(integer depth)
	integer iter(Point A,Point B,Point Center,integer depth)
		if depth==0 then
			library.LineST(A,B,0);
			return 1;
		end
		Point C=onethird(A,B,1);
		Point D=onethird(A,B,2);
		Line l1=library.LineST(A,C,0);
		l1.setvisible(false);
		Line l2=library.LineST(D,B,0);
		l2.setvisible(false);
		Circle c1=library.DrawCircle(C,l1);
		c1.setvisible(false);
		Circle c2=library.DrawCircle(D,l2);
		c2.setvisible(false);
		Point E=library.intersect(c1,c2,true);
		Point F=library.intersect(c1,c2,false);
		if Dist(Center,E)>Dist(Center,F) then
			F.setvisible(false);
		else
			E.setvisible(false);
			E=F;
		end
		Point O1=library.PointXY((C.getX()+D.getX()+E.getX())/3.0,(C.getY()+D.getY()+E.getY())/3.0);
		O1.setvisible(false);
		iter(A,C,Center,depth-1);
		iter(C,E,O1,depth-1);
		iter(E,D,O1,depth-1);
		iter(D,B,Center,depth-1);
		return 1;
	end
	Point A=library.PointXY(200.0,200.0);
	Point B=library.PointXY(600.0,200.0);	
	Point C=library.PointXY(400,200+200*1.732050808);
	Point O=library.PointXY(400,200+200*1.732050808/3.0);
	O.setvisible(false);
	iter(A,B,O,depth);
	iter(B,C,O,depth);
	iter(C,A,O,depth);	
	A.setXY(200,200);
	C.setXY(200,600);
	B.setXY(200+200*1.732050808,400);
	library.paint();
	return 1;
end
snowflake(2);